GameFramework

🤔


持续更新

  • GameFramework 是一个基于 Unity 5.3+ 引擎的游戏框架,主要对游戏开发过程中常用模块进行了封装,很大程度地规范开发过程、加快开发速度并保证产品质量。
    QQ群:216332935

  • 在最新的 Game Framework 版本中,包含以下 17 个内置模块
  1. 数据结点 (Data Node) – 将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据。
  2. 数据表 (Data Table) – 可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。
  3. 调试器 (Debugger) – 当游戏在 Unity 编辑器中运行或者以 Development 方式发布运行时,将出现调试器窗口,便于查看运行时日志、调试信息等。用户还可以方便地将自己的功能注册到调试器窗口上并使用。
  4. 下载 (Download) – 提供下载文件的功能,支持断点续传,并可指定允许几个下载器进行同时下载。更新资源时会主动调用此模块。
  5. 实体 (Entity) – 将游戏场景中,动态创建的一切物体定义为实体。此模块提供管理实体和实体组的功能,如显示隐藏实体、挂接实体(如挂接武器、坐骑,或者抓起另一个实体)等。实体使用结束后可以不立刻销毁,从而等待下一次重新使用。
  6. 事件 (Event) – 游戏逻辑监听、抛出事件的机制。Game Framework 中的很多模块在完成操作后都会抛出内置事件,监听这些事件将大大解除游戏逻辑之间的耦合。用户也可以定义自己的游戏逻辑事件。
  7. 有限状态机 (FSM) – 提供创建、使用和销毁有限状态机的功能,一些适用于有限状态机机制的游戏逻辑,使用此模块将是一个不错的选择。
  8. 本地化 (Localization) – 提供本地化功能,也就是我们平时所说的多语言。Game Framework 在本地化方面,不但支持文本的本地化,还支持任意资源的本地化,比如游戏中释放烟花特效也可以做出几个多国语言的版本,使得中文版里是“新年好”字样的特效,而英文版里是“Happy New Year”字样的特效。
  9. 网络 (Network) – 提供使用 Socket 长连接的功能,当前支持 TCP 协议,同时兼容 IPv4 和 IPv6 两个版本。用户可以同时建立多个连接与多个服务器同时进行通信,比如除了连接常规的游戏服务器,还可以连接语音聊天服务器。如果想接入 ProtoBuf 之类的协议库,只要派生自 Packet 类并实现自己的消息包类即可使用。
  10. 对象池 (Object Pool) – 提供对象缓存池的功能,避免频繁地创建和销毁各种游戏对象,提高游戏性能。除了 Game Framework 自身使用了对象池,用户还可以很方便地创建和管理自己的对象池。
  11. 流程 (Procedure) – 是贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现自己的流程类即可使用。
  12. 资源 (Resource) – 为了保证玩家的体验,我们不推荐再使用同步的方式加载资源,由于 Game Framework 自身使用了一套完整的异步加载资源体系,因此只提供了异步加载资源的接口。不论简单的数据表、本地化字典,还是复杂的实体、场景、界面,我们都将使用异步加载。同时,Game Framework 提供了默认的内存管理策略(当然,你也可以定义自己的内存管理策略)。多数情况下,在使用 GameObject 的过程中,你甚至可以不需要自行进行 Instantiate 或者是 Destroy 操作。
  13. 场景 (Scene) – 提供场景管理的功能,可以同时加载多个场景,也可以随时卸载任何一个场景,从而很容易地实现场景的分部加载。
  14. 配置 (Setting) – 以键值对的形式存储玩家数据,对 UnityEngine.PlayerPrefs 进行封装。
  15. 声音 (Sound) – 提供管理声音和声音组的功能,用户可以自定义一个声音的音量、是2D声音还是3D声音,甚至是直接绑定到某个实体上跟随实体移动。
  16. 界面 (UI) – 提供管理界面和界面组的功能,如显示隐藏界面、激活界面、改变界面层级等。不论是 Unity 内置的 uGUI 还是其它类型的 UI 插件(如 NGUI),只要派生自 UIFormLogic 类并实现自己的界面类即可使用。界面使用结束后可以不立刻销毁,从而等待下一次重新使用。
  17. Web 请求 (Web Request) – 提供使用短连接的功能,可以用 Get 或者 Post 方法向服务器发送请求并获取响应数据,可指定允许几个 Web 请求器进行同时请求。

GameFrameworkEntry(框架入口)

GameFrameworkEntry使用链表来维护所有的GameFrameworkModule(框架模块),并提供对GameFrameworkModule的各种相关操作以及框架版本号信息

  1. 只有在获取模块时,对应模块不存在才会创建模块
  2. 创建模块时,根据模块优先级决定新模块在链表中的位置
  3. 轮询模块时,根据优先级决定轮询顺序(即正向遍历链表调用OnUpdate)(在**UGF中,由BaseComponent**来调用轮询方法
  4. 所有的**Manager类都需要继承GameFrameworkModule**,并实现对应的IManager接口

GameEntry(游戏入口)

示例程序Start Force里包含两个**GameEntry**,一个是UGF的,一个是Start Force的。Start Force在场景GameFramework中有一个Game Framework物体,上面挂载了Start Force的GameEntry脚本作为游戏入口

  1. UGF的GameEntry使用链表来维护所有的GameFrameworkComponent(框架组件),并提供各种相关操作。
  2. 所有GameFrameworkComponent在Awake中调用UGF的GameEntry的RegisterComponent(GameFrameworkComponen),将自身添加到UGF的GameEntry中的链表里
  3. Start Force的GameEntry脚本持有所有GameFrameworkComponent的引用,被分成了3个部分,分别负责调用Start方法,初始化内置GameFrameworkComponent,初始化自定义GameFrameworkComponent
  4. GameFramework物体下有预制体Builtin(由UGF框架提供,原名GameFramework),该预制体下的所有子物体分别挂载了所有的内置GameFrameworkComponent。所有内置**GameFrameworkComponent都持有一个对应IManager接口的引用(可以视作GFManagerUGF**中的代理或实现),在初始化时通过GameFrameworkEntry来获取实例
  5. 自定义的**GameFrameworkComponent**需要另外创建一个空物体作为GameFramework的子物体,然后将自定义组件各自挂载到空物体下,作为其子物体

FSM(有限状态机)与Procedure(流程)

流程是贯穿游戏运行时整个生命周期的有限状态机。框架用流程来处理所有的事情,不同的流程负责不同的工作,流程的切换是用有限状态机来实现的

  1. FSM模块主要由状态,状态机,状态机管理器三部分组成
  2. 状态FsmState维护一个事件码与事件处理方法的字典,并提供各种对应操作
  3. 状态机Fsm继承FsmBase并实现IFsm接口,维护该状态机的所有状态与状态机数据,并提供各种对应操作
  4. 状态机管理器FsmManager维护所有状态机,并提供各种对应操作
  5. Procedure模块主要由流程基类和流程管理器两部分组成
  6. 流程基类ProcedureBase继承自FsmState,可以理解为一种特殊的状态
  7. 流程管理器ProcedureManager持有FsmManager与自身的Fsm的引用,并提供对流程的相关操作
  8. 在**UGF中的ProcedureComponent**,主要负责读取创建好的流程类,然后调用ProcedureManager来创建并开始状态机

Event(事件)

Event是游戏逻辑监听、抛出事件的机制。

  1. Event模块由事件参数,事件池,事件管理器三部分组成
  2. 事件参数基类BaseEventArgs继承GameFrameworkEventArgs(还有另一种事件参数类也继承GameFrameworkEventArgs,那种事件不受**Event**模块管理
  3. 事件池EventPool主要维护事件结点(Event)(Event是对BaseEventArgs的封装)的队列(该队列处理线程安全的事件抛出)与一个事件码与事件处理方法的字典,并提供各种对应操作
  4. 事件管理器EventManager是对EventPool里各种操作的代理

任务(Task)

Task功能主要负责管理Web请求、资源的下载或加载的任务的执行

  1. Task功能主要由任务,任务代理,任务池三部分组成
  2. 任务(ITask)存储了任务执行需要的数据
  3. 任务代理(ITaskAgent)是对ITask的代理类,提供对任务的各种对应操作
  4. 任务池TaskPool负责维护三种容器(可用任务代理,工作中任务代理,等待任务),并提供各种对应操作

DataNode(数据结点)

DataNode将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据
数据结点的使用非常灵活,有以下三种使用方式:
使用数据结点组件,直接通过绝对路径获取或设置数据;
使用数据结点组件,通过参照某个数据结点和相对路径获取或设置数据;
使用数据结点组件获取数据结点后,通过数据结点的接口进行更多操作。

  1. DataNode模块由数据结点和数据结点管理器两部分组成
  2. 数据结点(DataNode)存储数据以及父结点、子结点的相关信息
  3. 数据结点管理器(DataNodeManager)管理根结点,并提供数据结点的相关操作

ObjectPool(对象池)

ObjectPool提供对象缓存池的功能,避免频繁地创建和销毁各种游戏对象,提高游戏性能。

  1. ObjectPool模块主要由对象基类,内部对象,对象池,对象池管理器三部分组成
  2. 对象基类(ObjectBase)是所有需要由ObjectPool模块管理的对象的父类
  3. 内部对象(Object)存储ObjectBase相关数据,并提供获取与回收的方法
  4. 对象池(ObjectPool)使用链表维护池子里的所有Object,并提供各种相关操作
  5. 对象池管理器(ObjectPoolManager)使用字典维护所有ObjectPool,并提供各种相关操作
宇 wechat
扫描二维码,订阅微信公众号